Skip to content

Spec #2405 - Manifests without installer info#6286

Draft
Trenly wants to merge 3 commits into
microsoft:masterfrom
Trenly:Spec2405
Draft

Spec #2405 - Manifests without installer info#6286
Trenly wants to merge 3 commits into
microsoft:masterfrom
Trenly:Spec2405

Conversation

@Trenly

@Trenly Trenly commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

📖 Description

This PR introduces the specification for the NoInstaller installer type (Issue #2405), enabling WinGet to recognize and manage packages that have no downloadable installer. The specification covers the complete design for:

  • Installer Type Support — New NoInstaller enum value in InstallerTypeEnum
  • Manifest Schema — New InstallerAvailabilityMessage field (manifest v1.30.0) with field constraints
  • CLI Behavior — Install, upgrade, show, search, and uninstall command handling
  • ARP Correlation — Using ProductCode and AppsAndFeaturesEntries for managing pre-installed software
  • Use Cases — System components, pre-installed software, out-of-band distributions, version tombstones
  • Validation — Validation-NoExecutables waiver requirement for community repository
  • Architecture & Locale Scenarios — Mixed installability and availability across architectures and locales
  • Future Enhancements — Issue Support for filtering packages on installer method #823 installer filtering with default exclusion of NoInstaller packages

The specification addresses all design feedback from PR #6157 and provides a comprehensive reference for implementation across winget-cli, winget-create, winget-cli-restsource, and winget-pkgs.

🔗 References

🔍 Validation

No validation needed — This is a specification document that describes design intent and expected behavior. No code changes, manifests, or executable artifacts are included.

✅ Checklist

📋 Issue Type

  • Bug fix
  • Feature
  • Task — Specification documentation

@github-actions

This comment has been minimized.

* Add 'installable' - term used in NoInstaller specification
* Add 'Trenly' - author name in specification
* Add 'waivered' - term used in validation policy description

Addresses check-spelling-bot findings from PR microsoft#6286
Comment thread doc/specs/#2405 - NoInstaller Installer Type.md Outdated
Comment thread doc/specs/#2405 - NoInstaller Installer Type.md Outdated

The `NoInstaller` installer type and `InstallerAvailabilityMessage` field are introduced in **Manifest Version 1.30.0**.

Older clients (< 1.30.0) will not recognize `InstallerType: NoInstaller` or `InstallerAvailabilityMessage` fields because they are part of manifest version 1.30.0. The manifest validation schema enforces version requirements.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should test the actual behavior to see what errors/warnings happen if we do this. We may need to consider when the right time is to roll this out into production for the community repository, and what default versions of WinGet on various OS versions will do.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PS E:\winget-cli> wingetdev validate E:\winget-pkgs\manifests\b\Badlion\BadlionClient\3.1.9
Manifest validation succeeded.
PS E:\winget-cli> wingetdev show -m E:\winget-pkgs\manifests\b\Badlion\BadlionClient\3.1.9
Found Badlion Client [Badlion.BadlionClient]
Version: 3.1.9
Publisher: Badlion
Publisher Support Url: https://support.badlion.net/
Moniker: blc
Description: Badlion Client is a Minecraft launcher with many added features. It includes anticheat, built-in FPS boost and other mods, and is compatible with most versions of minecraft 1.7 or newer.
License: Proprietary
Copyright: © 2013-2021 ESL Gaming Online, Inc.
Tags:
  minecraft
  optifine
Installer:
  Installer Type: noinstaller
  Installer Locale: en-US
  Installer SHA256: 85f8124a876d702319807b5604814c07d9099b43863f585543f2f1b1c95cdf1d
  Offline Distribution Supported: false
  Installer Availability Message: This is for testing only
PS E:\winget-cli> winget install -m E:\winget-pkgs\manifests\b\Badlion\BadlionClient\3.1.9
Found Badlion Client [Badlion.BadlionClient] Version 3.1.9
This application is licensed to you by its owner.
Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.
An unexpected error occurred while executing the command:
0x80004003 : Invalid pointer
PS E:\winget-cli> winget -v
v1.28.240

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like that path could be improved to better communicate the unknown installer type. It might be getting interrupted by a faulty assumption before hitting an existing version of that.

Comment thread doc/specs/#2405 - NoInstaller Installer Type.md

@JohnMcPMS JohnMcPMS left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As a note on the overall item, I don't think we can take this work (not the spec, the actual product change) as a contribution without internal commitment to implementing it as it will require validation updates. Part of that is expressing a clear, prioritizable problem that is being solved.

Comment on lines +20 to +21
1. **System Components** — Windows built-in software, drivers, and OEM-installed applications often have no downloadable installer outside their original distribution channel.
2. **Pre-installed Software** — Recognizing applications that ship with the OS or hardware allows WinGet to correlate and manage them without installation.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the scenario to have a package that was never available? I don't really want to bloat the repository with these manifests if there is no purpose. We can already discover installed items just fine, the only thing I could see is bringing consistency to their identity (if the listed name changes over time for instance). But that alone doesn't seem worth the cost of maintainenace.


1. **System Components** — Windows built-in software, drivers, and OEM-installed applications often have no downloadable installer outside their original distribution channel.
2. **Pre-installed Software** — Recognizing applications that ship with the OS or hardware allows WinGet to correlate and manage them without installation.
3. **Out-of-Band Distributions** — Some publishers distribute software through non-WinGet channels (corporate systems, hardware partners, distribution agreements) and want WinGet to recognize these versions for correlation and upgrade tracking.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This still sounds like "was never available" and thus makes it fall into my previous question.

The field may also be specified at the root manifest level:

```yaml
InstallerAvailabilityMessage: "This version has been removed due to a security vulnerability"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I'm not mistaken, InstallerType can also be specified at the root and it would be reasonable to represent that in this example.


For community repository submissions with `NoInstaller` installer type:

- A new validation rule `Validation-NoExecutables` (similar to existing validation rules) must be introduced.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- A new validation rule `Validation-NoExecutables` (similar to existing validation rules) must be introduced.
- A new validation rule `Validation-NoInstaller` (similar to existing validation rules) must be introduced.

Name consistency?

- A new validation rule `Validation-NoExecutables` (similar to existing validation rules) must be introduced.
- This rule should be auto-waivered, requiring Microsoft review for each `NoInstaller` submission.
- This ensures that community contributions using `NoInstaller` are reviewed to prevent misuse (e.g., publishers blocking inclusion for "corporate reasons").
- Legitimate use cases (system components, OEM software, official tombstones) receive appropriate waiver.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that we need to have a solid policy on the legitimate use cases before we move forward with implementation. I don't want to end up with a scenario where no manifests are ever removed, they only become NoInstaller. The repo has already become quite large and we don't need to introduce a new rot mechanism.

PackageName: Example Package
License: Example License
ShortDescription: Example package description
LongDescription: This version is no longer available. Please upgrade to version 3.0.0.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't expect one to change the existing descriptions, that is what the availability message is for.


**Behavior:**
- User on x64 system can install normally.
- User on arm64 system receives message that ARM64 is unavailable and cannot install this version.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This glosses over the compatibility scenarios. If we are on ARM64, the current installer selection mode would choose the NoInstaller option and then fail that way. If you simply remove the ARM64 installer, it would check if x64 is supported on the device and potentially install that one.

It feels like the NoInstaller "installers" should be intentionally pushed to the lowest ranking in the selection order to prevent a potentially compatible installer from being overridden.

One must also take care to ensure that the upgrade scenario is not impacted, but I believe that is done largely through filtering of the installers and should therefore not be impacted by the sort ordering.


The `NoInstaller` installer type and `InstallerAvailabilityMessage` field are introduced in **Manifest Version 1.30.0**.

Older clients (< 1.30.0) will not recognize `InstallerType: NoInstaller` or `InstallerAvailabilityMessage` fields because they are part of manifest version 1.30.0. The manifest validation schema enforces version requirements.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like that path could be improved to better communicate the unknown installer type. It might be getting interrupted by a faulty assumption before hitting an existing version of that.


- No download activity for `NoInstaller` packages; user bandwidth and disk I/O are preserved.
- Install operation terminates immediately with an error message, avoiding wasted processing.
- Repo index size is minimally impacted; `NoInstaller` entries use the same schema as other installer types.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Depends on breadth of use.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants